package com.tanhua.server.service;

import com.tanhua.commons.exception.TanHuaException;
import com.tanhua.commons.key.RedisKeyConst;
import com.tanhua.domain.db.Question;
import com.tanhua.domain.db.Settings;
import com.tanhua.domain.db.User;
import com.tanhua.domain.vo.ErrorResult;
import com.tanhua.domain.vo.SettingsVo;
import com.tanhua.dubbo.api.QuestionApi;
import com.tanhua.dubbo.api.SettingApi;
import com.tanhua.dubbo.api.UserApi;
import com.tanhua.server.utils.JwtUtils;
import com.tanhua.server.utils.ThreadLocalUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class SettingServcie {

//    注入TheadLocalUtils对象
    @Autowired
    private ThreadLocalUtils threadUtils;
//    注入redisTemplate对象
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
//    注入jwt工具
    @Autowired
    private JwtUtils jwtUtils;
//    订阅UserApi接口服务
    @Reference
    private UserApi userApi;
//    订阅SettingApi接口服务
    @Reference
    private SettingApi settingApi;
//    订阅QuetsionAPi接口服务
    @Reference
    private QuestionApi questionApi;

    /**
     * 通知管理
     * @param likeNotification
     * @param pinglunNotification
     * @param gonggaoNotification
     * @returnt
     */
    public ResponseEntity notificationsManager(Boolean likeNotification, Boolean pinglunNotification, Boolean gonggaoNotification) {
//        调用token方法 获取到user对象
        Long userId = threadUtils.getUserId();
        Settings setting = settingApi.getSettingById(userId.intValue());
        if(setting==null){
            Settings settings = new Settings();
            log.debug("数据库中没有找到对应的设置信息");
            settings.setUserId(userId.intValue());
            settings.setLikeNotification(likeNotification);
            settings.setPinglunNotification(pinglunNotification);
            settings.setGonggaoNotification(gonggaoNotification);
//        调用userMapper方法 传入对象
            settingApi.save(settings);
        }
        else {
            log.debug("数据库中找到对应的设置信息");
            setting.setUserId(userId.intValue());
            setting.setLikeNotification(likeNotification);
            setting.setPinglunNotification(pinglunNotification);
            setting.setGonggaoNotification(gonggaoNotification);
//        调用userMapper方法 传入对象
            settingApi.update(setting);
        }
        return ResponseEntity.ok(null);
    }

    /**
     * 查看通用设置
     * @return
     */
    public ResponseEntity getSettingData() {

//       调用ThreadLocal工具类获取对象ID
        Long userId = threadUtils.getUserId();
//       创建SettingVo对象
        SettingsVo settingsVo = new SettingsVo();
//       调用settingAPi 传入id 返回setting对象
        Settings setting = settingApi.getSettingById(userId.intValue());
//        复制setting对象属性到SettingVo对象属性上
        if(setting!=null){
            log.debug("查询到setting对象："+setting);
            BeanUtils.copyProperties(setting,settingsVo);
        }else {
            log.debug("数据库没有查询到setting对象");
        }
//       调用questionAPi 传入id 返回question对象
        Question question = questionApi.getQuestById(userId.intValue());
//       可以给用户设置一个默认的消息
        String message="心动的感觉？";
        if(question!=null){
            log.debug("查询到setting对象："+question);
            message=question.getTxt();
        }else {
            log.debug("数据库没有查询到question对象");
        }
//      设置settingVo的问题属性
        settingsVo.setStrangerQuestion(message);
//       设置手机属性
        settingsVo.setPhone(threadUtils.getMobile());
//       设置ID属性
//        settingsVo.setId(userId.intValue());
//      返回前端
        return  ResponseEntity.ok(settingsVo);
    }

    /**
     * 发送手机号
     */
    public void sendVerificationCode() {
//      通过ThreadLocal获取到手机号码
        String mobile = threadUtils.getMobile();
//      将手机号码加上指定的前缀
        String prefixPhone = RedisKeyConst.CHANGE_MOBILE_VALIDATE_CODE + mobile;
//      根据前缀手机号获取redis中的值
        ValueOperations opsForValue = redisTemplate.opsForValue();
        String o = (String) opsForValue.get(prefixPhone);
//       如果值不为空 那么就报异常
        if(o!=null){
            log.debug("验证码不为空："+o);
            throw new TanHuaException(ErrorResult.duplicate());
        }
//       值为空 生成一个6位数的验证码
        String code = RandomStringUtils.randomNumeric(6);
//       调用阿里云的模板对象 传入手机号和验证码 （用控制台代替）
        log.debug("尊敬的用户："+mobile+"-  您的验证码为："+code);
//        将生成的验证码存入redis
        opsForValue.set(prefixPhone,code);
    }

    /**
     * 修改手机号 - 2 校验验证码
     */
    public Map checkVerificationCode(String code) {
//        设置状态信息
        Boolean status= false;
//        通过ThreadLocal获取到手机号码
        String mobile = threadUtils.getMobile();
//        将手机号码拼接
        String prefixPhone = RedisKeyConst.CHANGE_MOBILE_VALIDATE_CODE + mobile;
//        将拼接后的手机号到redis中查询是否存在值
        ValueOperations opsForValue = redisTemplate.opsForValue();
        String redisCode = (String) opsForValue.get(prefixPhone);
//        如果不存在报异常
        if(redisCode==null){
            log.debug("验证码失效了");
           throw  new TanHuaException(ErrorResult.loginError());
        }
//        如果存在 校验验证码
        if(!redisCode.equals(code)){
            log.debug("验证码错误!");
            throw  new TanHuaException(ErrorResult.validateCodeError());
        }
        log.debug("修改手机的验证成功了!");
        status=true;
//        redis中的验证码删除掉
        redisTemplate.delete(prefixPhone);
//        包装结果返回
        Map<String,Boolean> map=new HashMap<String,Boolean>();
        map.put("verification",status);
        return map;
    }
    /**
     * 修改手机号 - 3 保存
     */
    public void editPhone(String phone, String token) {
//       获得当前用户的ID
        Long userId = threadUtils.getUserId();
//        调用settingAPi方法 传入当前用户ID和新的手机号
        User user = new User();
        user.setId(userId);
        user.setMobile(phone);
        userApi.updateMobile(user);
//        删除redis中的token
        String prefix = RedisKeyConst.USER_TOKEN + token;
        redisTemplate.delete(prefix);
    }

    /**
     * 设置陌生人消息
     */
    public ResponseEntity setQuestion(String message) {
//        从TheadLocalUtils中获取到指定的用户ID
        Long userId = threadUtils.getUserId();
//        根据ID查询quetison问题表
        Question questById = questionApi.getQuestById(userId.intValue());
//        判断对象是否为null 如果为Null 那么就指定更新
        if (questById==null){
            //创建一个question对象 设置消息内容为用户输入的消息
            Question question=new Question();
            question.setUserId(userId.intValue());
            question.setTxt(message);
            //调用更新语句 更新记录
            questionApi.saveMessage(question);
        }
//        返回
        return  ResponseEntity.ok(null);

    }
}
